/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import HibernateConfig.HibernateUtil;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.Matematica;

/**
 *
 * @author Enrique
 */

// CLASE QUE SE ENCARGA DE LA CARGA DE LAS ESTRUCTURAS DE DATOS PARA LA SIMULACION

public class Carga {

    
    // ATRIBUTOS
    
    
    // CONSTRUCTORES
    
    
    // SETTERS Y GETTERS
    
    
    // METODOS
    
    // metodo para carga todas las estructuras de datos necesarias para la simulacion
    public static void cargarEstructuras(Simulacion simulacion){
        
        // carga de nodos (ciudades)
        Carga.rellenarListaNodos(simulacion);
        
        // carga de aristas (vuelos)
        Carga.rellenarListaAristas(simulacion);
        
        // rellenado de lista de aristas vecinas en cada nodo
        Carga.rellenarListaAristasVecinas(simulacion);
    }
      
    // metodo para leer archivo con ciudades, y crear lista de nodos
    public static void rellenarListaNodos(Simulacion simu){
        BufferedReader inputStream = null;
        PrintWriter outputStream = null;
        
        //int contador = 0;
        
        // leo el archivos con info de ciudades (mas rapido que conectarse a BD)
        try{
            //inputStream = new BufferedReader(new FileReader(simu.getDirectorio_archivos() + File.separator + "ciudades con cordenadas csv.csv"));
            inputStream = new BufferedReader(new FileReader(simu.getDirectorio_archivos() + File.separator + "ciudades con cordenadas csv2.csv"));
            String linea = null;   // cada linea del archivo a leer
            String[] atributos = null; //lista de atributos para crear la ciudad del nodo
            Nodo nodo = null;
            Ciudad ciudad = null;
            
            
            while ((linea = inputStream.readLine()) != null){   //mientras lea linea y no haya llegado al final del archivo
                
                //proceso la cadena para obtener datos de la ciudad y crear un objeto ciudad
                
                atributos = linea.split(",");    //separo la linea por sus comas
                
                //creo objeto ciudad
                ciudad = new Ciudad();
                ciudad.setCiudad(atributos[1]);
                ciudad.setOaci(atributos[0]);
                ciudad.setPais(atributos[2]);
                ciudad.setAbreviacion(atributos[3]);
                Random generadorNumAleatorio = new Random();    // generador de numeros aleatorios para la capacidad de las ciudades
                ciudad.setCapMax(generadorNumAleatorio.nextInt(400)+600);
                ciudad.setCapDisp(ciudad.getCapMax());
                ciudad.setLatitud(Double.parseDouble(atributos[4]));
                ciudad.setLongitud(Double.parseDouble(atributos[5]));
                ciudad.setDiferenciaHora(Double.parseDouble(atributos[6]));
                ciudad.setX(Integer.parseInt(atributos[7]));
                ciudad.setY(Integer.parseInt(atributos[8]));
                nodo = new Nodo(ciudad,0,0,0,null,null);    // creo nodo con esa ciudad
                simu.getListaNodos().add(nodo);   //aÃ±ado nodo a la lista de nodos
                
                //contador ++;
            }
            
            
            
        // atrapo excepciones
        } catch (FileNotFoundException ex) {    
            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
        
        
        
        
        } finally {     //cierro streams
            if (inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException ex) {
                    Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (outputStream != null){
                outputStream.close();
            }
        }
        
        //System.out.println("Num. ciudades: " + contador);
        
    }

    
    // metodo para leer archivo de vuelos, y crear lista de aristas
    public static void rellenarListaAristas(Simulacion simu) {
        BufferedReader inputStream = null;
        PrintWriter outputStream = null;
        
        //int contador = 0;
        
        try{
            simu.setMinutos_sim(60);   // inicialmente, se espera que los vuelos salen cada 60 minutos
            //inputStream = new BufferedReader(new FileReader(simu.getDirectorio_archivos() + File.separator + "plan_vuelo.txt"));  // el archivo debe estar en el directorio proporcionado por el usuario, y con ese nombre exacto
            inputStream = new BufferedReader(new FileReader("plan_vuelo.txt"));
            String linea = null;   // cada linea del archivo a leer
            String[] atributos = null; //lista de atributos para crear el vuelo de la arista
            Arista arista = null;
            Vuelo vuelo = null;
            DateFormat formatoTiempo = new SimpleDateFormat("HH:mm");
            float minutos_temp;
            
            while ((linea = inputStream.readLine()) != null){   //mientras lea linea y no haya llegado al final del archivo
                
                //proceso la cadena para obtener datos de los vuelos y crear un objeto arista
                
                atributos = linea.split("-");    //separo la linea por sus guiones
                
                // creo arista con ese vuelo
                vuelo = new Vuelo();
                vuelo.setCiudadByIdCiudadOrigen(Nodo.buscarNodoPorOaci(atributos[0],simu.getListaNodos()).getCiudad());
                vuelo.setCiudadByIdCiudadDestino(Nodo.buscarNodoPorOaci(atributos[1],simu.getListaNodos()).getCiudad());
                Random generadorNumAleatorio = new Random();    // generador de numeros aleatorios para la capacidad de los aviones
                vuelo.setCapMax(generadorNumAleatorio.nextInt(100)+200);
                vuelo.setHoraPartida(formatoTiempo.parse(atributos[2]));
                vuelo.setHoraLlegada(formatoTiempo.parse(atributos[3]));
                
                arista = new Arista(vuelo,Nodo.buscarNodoPorOaci(atributos[0],simu.getListaNodos()), 
                        Nodo.buscarNodoPorOaci(atributos[1],simu.getListaNodos()));
                simu.getListaAristas().add(arista);   //aÃ±ado nodo a la lista de nodos
                
                // evaluo la hora de partida y llegada del vuelo para actualizar minutos_sim
                
                // evaluo hora de partida
                minutos_temp = Float.parseFloat(atributos[2].substring(4));
                if (minutos_temp==0) minutos_temp = 60; // si es minuto cero, significa que sale cada 60 minutos
                simu.setMinutos_sim(Matematica.mcd(minutos_temp,simu.getMinutos_sim())); // maximo comun divisor entre minutos_sim y los minutos de este vuelo
                
                // evaluo hora de llegada
                minutos_temp = Float.parseFloat(atributos[3].substring(4));
                if (minutos_temp==0) minutos_temp = 60; // si es minuto cero, significa que sale cada 60 minutos
                simu.setMinutos_sim(Matematica.mcd(minutos_temp,simu.getMinutos_sim())); // maximo comun divisor entre minutos_sim y los minutos de este vuelo
                
                //contador ++;
            }
            
            
            
        // atrapo excepciones
        } catch (FileNotFoundException ex) {    
            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
        
        
        
        
        } finally {     //cierro streams
            if (inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException ex) {
                    Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (outputStream != null){
                outputStream.close();
            }
        }
        
        //System.out.println("Num. vuelos: " + contador);
        //System.out.println("minutos_sim: " + minutos_sim);
    }
 
    // metodo para rellenar la lista de aristas vecinas de cada nodo
    public static void rellenarListaAristasVecinas(Simulacion simu){
        
        //List<Arista> listaAristasDelNodo = new ArrayList<Arista>();
        
        for (int i=0; i < simu.getListaNodos().size(); i++){    // para cada uno de los nodos
            //listaAristasDelNodo.clear();    // reseteo la lista
            
            for (int j=0; j < simu.getListaAristas().size(); j++){  // para cada una de las aristas
                if (simu.getListaAristas().get(j).getNodoInicial().equals(simu.getListaNodos().get(i))){    // si esa arista tiene como nodo inicial al nodo bajo analisis
                   // listaAristasDelNodo.add(Algoritmo.listaAristas.get(j)); //aÃ±ado dicha lista a la lista de aristas vecinas del nodo
                   simu.getListaNodos().get(i).getListaAristasOrigen().add(simu.getListaAristas().get(j)); //aÃ±ado dicha lista a la lista de aristas vecinas del nodo
                }
            }
            //Algoritmo.listaNodos.get(i).setListaAristasOrigen(listaAristasDelNodo);     // actualizo la lista de aristas origen de ese nodo
        }
        
    }
    
    
    // metodo para carga todas las estructuras de datos necesarias para la simulacion DESDE LA BD
    public static void cargarEstructurasDesdeBD(Simulacion simulacion){
        
        // carga de nodos (ciudades)
        Carga.rellenarListaNodosDesdeBD(simulacion);
        
        // carga de aristas (vuelos)
        Carga.rellenarListaAristasDesdeBD(simulacion);
        
        // rellenado de lista de aristas vecinas en cada nodo
        Carga.rellenarListaAristasVecinas(simulacion);
    }
    
    // metodo para leer archivo con ciudades, y crear lista de nodos
    public static void rellenarListaNodosDesdeBD(Simulacion simu){
             
        
            Nodo nodo = null;
            Ciudad ciudadTemp = null;
            
            // objetos necesarios para la conexion con BD
            Session sesion = HibernateUtil.getSessionFactory().openSession();
            Transaction transaccion = null;
                        
            try {
                transaccion = sesion.beginTransaction();

                List ciudades = sesion.createQuery("from Ciudad").list();   // query para obtener todas las ciudades
                Iterator iterador = ciudades.iterator();    // iterador de la lista de ciudades


                while (iterador.hasNext()){   //mientras hayan ciudades en el list

                    //creo objeto ciudad
                    ciudadTemp = (Ciudad) iterador.next();   // obtengo una ciudad de la lista de ciudades
//                    Random generadorNumAleatorio = new Random();    // generador de numeros aleatorios para la capacidad de las ciudades
//                    ciudadTemp.setCapMax(generadorNumAleatorio.nextInt(400)+600);
                    ciudadTemp.setCapDisp(ciudadTemp.getCapMax());
                    nodo = new Nodo(ciudadTemp,0,0,0,null,null);    // creo nodo con esa ciudad
                    simu.getListaNodos().add(nodo);   //agrego nodo a la lista de nodos

                }
            // atrapo excepciones    
            } catch (HibernateException e){ 
                transaccion.rollback();
                e.printStackTrace();
            } finally {
                sesion.close(); // cierro la sesion (BD)
            }
            
    }
    
    // metodo para leer vuelos DESDE BD, y crear lista de aristas
    public static void rellenarListaAristasDesdeBD(Simulacion simu) {
        
        // objetos necesarios para la conexion con BD
        Session sesion = HibernateUtil.getSessionFactory().openSession();
        Transaction transaccion = null;
        float minutos_temp;
        DateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
        Calendar horaTemp = Calendar.getInstance();
            
        try{
            transaccion = sesion.beginTransaction();
            
            List vuelos = sesion.createQuery("from Vuelo").list();  // obtengo lista de vuelos desde la BD
            Iterator iterador = vuelos.iterator();  // iterador para la lista de vuelos
            
            simu.setMinutos_sim(60);   // inicialmente, se espera que los vuelos salen cada 60 minutos
            
            while (iterador.hasNext()){ // mientras hayan vuelos en la lista de vuelos
                Vuelo vuelo = (Vuelo) iterador.next();  // obtengo el vuelo de la lista
                //Random generadorNumAleatorio = new Random();    // generador de numeros aleatorios para la capacidad de los aviones
                //vuelo.setCapMax(generadorNumAleatorio.nextInt(100)+200);
                //vuelo.getHistorialVuelos().clear(); //limpio los historiales de vuelos de ese vuelo
                Arista arista = new Arista(vuelo,Nodo.buscarNodoPorOaci(vuelo.getCiudadByIdCiudadOrigen().getOaci(),simu.getListaNodos()),
                                Nodo.buscarNodoPorOaci(vuelo.getCiudadByIdCiudadDestino().getOaci(),simu.getListaNodos())); //agrego arista a la lista de aristas
                simu.getListaAristas().add(arista); // agrego la arista a la lista de aristas
                
                // evaluo la hora de partida y llegada del vuelo para actualizar minutos_sim
                
                // evaluo hora de partida
                horaTemp.setTime(vuelo.getHoraPartida());
                minutos_temp = horaTemp.get(Calendar.MINUTE);
                if (minutos_temp==0) minutos_temp = 60; // si es minuto cero, significa que sale cada 60 minutos
                simu.setMinutos_sim(Matematica.mcd(minutos_temp,simu.getMinutos_sim())); // maximo comun divisor entre minutos_sim y los minutos de este vuelo
                
                // evaluo hora de llegada
                horaTemp.setTime(vuelo.getHoraLlegada());
                minutos_temp = horaTemp.get(Calendar.MINUTE);
                if (minutos_temp==0) minutos_temp = 60; // si es minuto cero, significa que sale cada 60 minutos
                simu.setMinutos_sim(Matematica.mcd(minutos_temp,simu.getMinutos_sim())); // maximo comun divisor entre minutos_sim y los minutos de este vuelo
                
            }
            
        // atrapo excepciones    
        } catch (HibernateException e){ 
            transaccion.rollback();
            e.printStackTrace();
                
        } finally {     //cierro conexion con BD
            sesion.close();
        }
        
    }
    
    
    
    
    
    
    
    
    // (NO USAR) metodo para cargar la BD con info de los vuelos (solo se ha corrido y correra una vez)
//    public static void guardarVuelosEnBD(Simulacion simu){
//        BufferedReader inputStream = null;
//        PrintWriter outputStream = null;
//        
//        // objetos necesarios para la conexion con BD
//        Session sesion = HibernateUtil.getSessionFactory().openSession();
//        Transaction transaccion = null;
//        
//        try{
//            
//            transaccion = sesion.beginTransaction();
//            
//            simu.setMinutos_sim(60);   // inicialmente, se espera que los vuelos salen cada 60 minutos
//            inputStream = new BufferedReader(new FileReader(simu.getDirectorio_archivos() + File.separator + "plan_vuelo.txt"));  // el archivo debe estar en el directorio proporcionado por el usuario, y con ese nombre exacto
//            String linea = null;   // cada linea del archivo a leer
//            String[] atributos = null; //lista de atributos para crear el vuelo de la arista
//            Arista arista = null;
//            Vuelo vuelo = null;
//            DateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
//            float minutos_temp;
//            
//            while ((linea = inputStream.readLine()) != null){   //mientras lea linea y no haya llegado al final del archivo
//                
//                //proceso la cadena para obtener datos de los vuelos y crear un objeto arista
//                
//                atributos = linea.split("-");    //separo la linea por sus guiones
//                
//                // creo arista con ese vuelo
//                vuelo = new Vuelo();
//                vuelo.setCiudadByIdCiudadOrigen(Nodo.buscarNodoPorOaci(atributos[0],simu.getListaNodos()).getCiudad());
//                vuelo.setCiudadByIdCiudadDestino(Nodo.buscarNodoPorOaci(atributos[1],simu.getListaNodos()).getCiudad());
//                Random generadorNumAleatorio = new Random();    // generador de numeros aleatorios para la capacidad de los aviones
//                vuelo.setCapMax(generadorNumAleatorio.nextInt(100)+200);
//                vuelo.setHoraPartida(formatoTiempo.parse(atributos[2]));
//                vuelo.setHoraLlegada(formatoTiempo.parse(atributos[3]));
//                
//                // busco la ciudad origen del vuelo
//                for (int i=0; i<simu.getListaNodos().size(); i++){
//                    if (simu.getListaNodos().get(i).getCiudad().getOaci().equalsIgnoreCase(atributos[0])){
//                        vuelo.setCiudadByIdCiudadOrigen(simu.getListaNodos().get(i).getCiudad());
//                        break;
//                    }
//                }
//                                
//                // busco la ciudad destino del vuelo
//                for (int i=0; i<simu.getListaNodos().size(); i++){
//                    if (simu.getListaNodos().get(i).getCiudad().getOaci().equalsIgnoreCase(atributos[1])){
//                        vuelo.setCiudadByIdCiudadDestino(simu.getListaNodos().get(i).getCiudad());
//                        break;
//                    }
//                }
//                
//                // guardo el vuelo en la BD
//                sesion.save(vuelo);
//                
//            }
//            
//            // hago commit a los cambios en la BD
//            transaccion.commit();
//                                    
//        // atrapo excepciones
//        } catch (FileNotFoundException ex) {    
//            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (IOException ex) {
//            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (ParseException ex) {
//            Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (HibernateException e){
//            transaccion.rollback();
//            e.printStackTrace();
//            
//        } finally {     //cierro streams
//            if (inputStream != null){
//                try {
//                    inputStream.close();
//                } catch (IOException ex) {
//                    Logger.getLogger(Carga.class.getName()).log(Level.SEVERE, null, ex);
//                }
//            }
//            if (outputStream != null){
//                outputStream.close();
//            }
//            sesion.close(); // cierro conexion con BD
//        }
//        
//    }
    
    
    public static void limpiarHistorialVuelos(Simulacion simu){
        for (int i=0; i<simu.getListaAristas().size(); i++){
            //simu.getListaAristas().get(i).getVuelo().getPaquetes().clear();
            simu.getListaAristas().get(i).getVuelo().setPaquetes(new HashSet(0));
            simu.getListaAristas().get(i).getVuelo().setHistorialVuelos(new HashSet(0));
        }
    }
    
    
    public static void rellenarListaNodosDesdeBD(SimulacionTracking simu){
             
        
            Nodo nodo = null;
            Ciudad ciudadTemp = null;
            
            // objetos necesarios para la conexion con BD
            Session sesion = HibernateUtil.getSessionFactory().openSession();
            Transaction transaccion = null;
                        
            try {
                transaccion = sesion.beginTransaction();

                List ciudades = sesion.createQuery("from Ciudad").list();   // query para obtener todas las ciudades
                Iterator iterador = ciudades.iterator();    // iterador de la lista de ciudades


                while (iterador.hasNext()){   //mientras hayan ciudades en el list

                    //creo objeto ciudad
                    ciudadTemp = (Ciudad) iterador.next();   // obtengo una ciudad de la lista de ciudades
                    Random generadorNumAleatorio = new Random();    // generador de numeros aleatorios para la capacidad de las ciudades
                    ciudadTemp.setCapMax(generadorNumAleatorio.nextInt(400)+600);
                    ciudadTemp.setCapDisp(ciudadTemp.getCapMax());
                    nodo = new Nodo(ciudadTemp,0,0,0,null,null);    // creo nodo con esa ciudad
                    simu.getListaNodos().add(nodo);   //agrego nodo a la lista de nodos

                }
            // atrapo excepciones    
            } catch (HibernateException e){ 
                transaccion.rollback();
                e.printStackTrace();
            } finally {
                sesion.close(); // cierro la sesion (BD)
            }
            
    }
    
    
    public static void rellenarListaAristasDesdeBD(SimulacionTracking simu) {
        
        // objetos necesarios para la conexion con BD
        Session sesion = HibernateUtil.getSessionFactory().openSession();
        Transaction transaccion = null;
        float minutos_temp;
        DateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
        Calendar horaTemp = Calendar.getInstance();
            
        try{
            transaccion = sesion.beginTransaction();
            
            List vuelos = sesion.createQuery("from Vuelo").list();  // obtengo lista de vuelos desde la BD
            Iterator iterador = vuelos.iterator();  // iterador para la lista de vuelos
            
            simu.setMinutos_sim(60);   // inicialmente, se espera que los vuelos salen cada 60 minutos
            
            while (iterador.hasNext()){ // mientras hayan vuelos en la lista de vuelos
                Vuelo vuelo = (Vuelo) iterador.next();  // obtengo el vuelo de la lista
                Random generadorNumAleatorio = new Random();    // generador de numeros aleatorios para la capacidad de los aviones
                vuelo.setCapMax(generadorNumAleatorio.nextInt(100)+200);
                //vuelo.getHistorialVuelos().clear(); //limpio los historiales de vuelos de ese vuelo
                Arista arista = new Arista(vuelo,Nodo.buscarNodoPorOaci(vuelo.getCiudadByIdCiudadOrigen().getOaci(),simu.getListaNodos()),
                                Nodo.buscarNodoPorOaci(vuelo.getCiudadByIdCiudadDestino().getOaci(),simu.getListaNodos())); //agrego arista a la lista de aristas
                simu.getListaAristas().add(arista); // agrego la arista a la lista de aristas
                
                // evaluo la hora de partida y llegada del vuelo para actualizar minutos_sim
                
                // evaluo hora de partida
                horaTemp.setTime(vuelo.getHoraPartida());
                minutos_temp = horaTemp.get(Calendar.MINUTE);
                if (minutos_temp==0) minutos_temp = 60; // si es minuto cero, significa que sale cada 60 minutos
                simu.setMinutos_sim(Matematica.mcd(minutos_temp,simu.getMinutos_sim())); // maximo comun divisor entre minutos_sim y los minutos de este vuelo
                
                // evaluo hora de llegada
                horaTemp.setTime(vuelo.getHoraLlegada());
                minutos_temp = horaTemp.get(Calendar.MINUTE);
                if (minutos_temp==0) minutos_temp = 60; // si es minuto cero, significa que sale cada 60 minutos
                simu.setMinutos_sim(Matematica.mcd(minutos_temp,simu.getMinutos_sim())); // maximo comun divisor entre minutos_sim y los minutos de este vuelo
                
            }
            
        // atrapo excepciones    
        } catch (HibernateException e){ 
            transaccion.rollback();
            e.printStackTrace();
                
        } finally {     //cierro conexion con BD
            sesion.close();
        }
    }
    
    public static void rellenarListaAristasVecinas(SimulacionTracking simu){
        
        //List<Arista> listaAristasDelNodo = new ArrayList<Arista>();
        
        for (int i=0; i < simu.getListaNodos().size(); i++){    // para cada uno de los nodos
            //listaAristasDelNodo.clear();    // reseteo la lista
            
            for (int j=0; j < simu.getListaAristas().size(); j++){  // para cada una de las aristas
                if (simu.getListaAristas().get(j).getNodoInicial().equals(simu.getListaNodos().get(i))){    // si esa arista tiene como nodo inicial al nodo bajo analisis
                   // listaAristasDelNodo.add(Algoritmo.listaAristas.get(j)); //aÃ±ado dicha lista a la lista de aristas vecinas del nodo
                   simu.getListaNodos().get(i).getListaAristasOrigen().add(simu.getListaAristas().get(j)); //aÃ±ado dicha lista a la lista de aristas vecinas del nodo
                }
            }
            //Algoritmo.listaNodos.get(i).setListaAristasOrigen(listaAristasDelNodo);     // actualizo la lista de aristas origen de ese nodo
        }
        
    }

    public static void inicializarEstructuras(Simulacion simu) {
        for (int i=0; i<simu.getListaAristas().size(); i++){
            Iterator<HistorialVuelo> iterador = simu.getListaAristas().get(i).getVuelo().getHistorialVuelos().iterator();
            while(iterador.hasNext()){
                HistorialVuelo historialVuelo = iterador.next();
                historialVuelo.setPaquetes(new HashSet(0));
                
            }
        }
    }
    
    public static void inicializarEstructuras(SimulacionTracking simu) {
        for (int i=0; i<simu.getListaAristas().size(); i++){
            Iterator<HistorialVuelo> iterador = simu.getListaAristas().get(i).getVuelo().getHistorialVuelos().iterator();
            while(iterador.hasNext()){
                HistorialVuelo historialVuelo = iterador.next();
                historialVuelo.setPaquetes(new HashSet(0));
                
            }
        }
    }
    
}
